perm filename MKVID1[2,BGB] blob sn#051788 filedate 1973-07-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00008 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE MKVID1  -  MAKE VIDEO TYPE 1.
C00004 00003	SUBR(TFILL)	TRIANGLE FILL.
C00007 00004	SUBR(FILL)
C00010 00005	SUBR(ADDSKY)	ADD SPAN INTO THE SKY ARRAY.
C00012 00006	SUBR(TVDSKO)  		INPUT TV PICTURE FROM A DISK FILE.
C00014 00007	SUBR(PACKTV)	PACK SKY RASTER INTO TV BUFFER.
C00015 00008	DATA AREA.
C00017 ENDMK
C⊗;
TITLE MKVID1  -  MAKE VIDEO TYPE 1.
;B.G.BAUMGART  -  1 JULY 1973.
COMMENT ⊗

	The design goal for this program is to make high
quality video images from polygons (triangles) in the
simplest possible way. The jaggies problem is solved by
brute force summation of 64 micro pixels per usual pixel.
The intensity of a region is determined by two linear
interpolations, (along edges, and along scan line).
⊗

;MAIN LOOP.
SA:
	CALL(TFILL)	;FILL ALL THE TRIANGLES.
	CALL(PACKTV)	;PACK SKY ARRAY INTO TV BUFFER.
	CALL(TVDSKO)	;OUTPUT TV BUFFER TO DISK FILE.
	EXIT

;FILL ARGUMENTS.
	DECLARE{COL1,COL2,COL3}		;MICRO COL.  0.0,,0
	DECLARE{ROW1,ROW2,ROW3}		;MICRO ROW.	0.0
	DECLARE{BRT1,BRT2,BRT3}		;BRIGHTNESS 00.0000
	DECLARE{DELC1,DELC2,DELC3}	;DELTA COLUMN.
	DECLARE{DELB1,DELB2,DELB3}	;DELTA BRIGHTNESS.
SUBR(TFILL)	;TRIANGLE FILL.
BEGIN TFILL;_________________________________________________________
	ACCUMULATORS{N,V1,V2,V3,R1,R2,R3,C1,C2,C3,B1,B2,B3}

;PICKUP A TRIANGLE.
L1:	LAC V1,TPTR↔SKIPGE(V1)↔POP0J	;EXIT AT END OF LIST.
	LACI V2,2(V1)
	LACI V3,2(V2)
	LACI 1,2(V3)↔DAC 1,TPTR

;ORDER THE VERTICES.
	LAC(V1)↔CAMLE(V2)↔EXCH V1,V2
	LAC(V1)↔CAMLE(V3)↔EXCH V1,V3
	LAC(V2)↔CAMLE(V3)↔EXCH V2,V3
	LAC 1,COLOR

;PICKUP & PLACE BINARY POINTS FOR COLUMN, ROW AND BRIGHTNESS.
L2:	FOR @$ I←1,3{
	CDR C$I,(V$I)↔LSH C$I,=15
	CAR R$I,(V$I)↔LSH R$I,-3
	LAC B$I,1(V$I)↔LSH B$I,(1)↔ANDI B$I,7770↔MOVSS B$I}

;COMPUTE DELTA'S.
L3:	LAC N,R1↔SUB N,R2
	LAC C1↔SUB C2↔SKIPE N↔IDIV N↔DAC DELC1
	LAC B1↔SUB B2↔SKIPE N↔IDIV N↔DAC DELB1
	LAC N,R1↔SUB N,R3
	LAC C1↔SUB C3↔SKIPE N↔IDIV N↔DAC DELC2
	LAC B1↔SUB B3↔SKIPE N↔IDIV N↔DAC DELB2
	LAC N,R2↔SUB N,R3
	LAC C2↔SUB C3↔SKIPE N↔IDIV N↔DAC DELC3
	LAC B2↔SUB B3↔SKIPE N↔IDIV N↔DAC DELB3

;SETUP FILL ARGUMENTS.
L4:	DAC R1,ROW1↔DAC R2,ROW2↔DAC R3,ROW3
	DAC C1,COL1↔DAC B1,BRT1↔DAC C1,COL2↔DAC B1,BRT2
	SETOM CCWFLG↔LAC DELC1↔CAMG DELC2↔GO .+8
	SETZM CCWFLG
	LAC DELC1↔EXCH DELC2↔DAC DELC1
	LAC DELB1↔EXCH DELB2↔DAC DELB1

;MAKE UPPER AND LOWER CALLS ON FILL SUBROUTINE.
L5:	CALL(FILL)
	LAC 0,DELC3↔LAC 1,DELB3
	SKIPN CCWFLG↔GO .+4
	DAC 0,DELC1↔DAC 1,DELB1↔GO .+3
	DAC 0,DELC2↔DAC 1,DELB2
	LAC ROW2↔DAC ROW1
	LAC ROW3↔DAC ROW2
	CALL(FILL)
	GO L1
BEND TFILL;BGB 2 JULY 1973.__________________________________________
SUBR(FILL)
BEGIN FILL;__________________________________________________________

;FILL MICRO ROWS (R1+1) INCLUSIVE TO R2.
;FILL MICRO PIXELS C1 INCLUSIVE TO (C2-1).

ACCUMULATORS{ROW,COL,R,C,C1,C2,B1,B2,CMIN,CMAX}
;PICKUP ARGUMENTS.
	LAC C1,COL1↔LAC C2,COL2
	LAC B1,BRT1↔LAC B2,BRT2
	LAC R,ROW1		;FIRST MICRO ROW.
	LAC ROW,R↔LSH ROW,-3	;FIRST MACRO ROW.
	SLACI CMIN,=288⊗3↔SETZ  CMAX,

;ADVANCE SEGMENT A MICRO ROW.
L1:	ADD C1,DELC1↔CAMGE C1,CMIN↔DAC C1,CMIN
	ADD C2,DELC2↔CAMLE C2,CMAX↔DAC C2,CMAX
	ADD B1,DELB1↔ADD B2,DELB2↔AOS R

;DELTA MICRO COLUMNS INTO AC1.
L2:	CAR 0,C2↔CAR 1,C1
	SUB 1,0↔JUMPGE 1,L4	;IGNORE THIN (OR BACKWARDS) SEGMENTS.
	CAR C,C1↔DIP 1,C	;SETUP MICRO COLUMN AOBJN POINTER.

;DELTA BRIGHTNESS PER MICRO COLUMN INTO AC0.
	LAC B1↔SUB B2
	SKIPE↔IDIV 1
	LAC 1,B1
	CAR COL,C1↔LSH COL,-3↔GO .+3	;FIRST MACRO COLUMN.

;INNER MOST LOOP.
L3:	TRNN C,7↔AOS COL
	ADDM 1,SPAN(COL)	;ADD BRIGHTNESS OF ONE MICRO PIXEL.
	ADD 1,0			;DELTA BRIGHTNESS PER MICRO PIXEL.
	AOBJN C,L3

;ADVANCE MICRO ROW.
L4:	LDB 0,[POINT 3,R,35]
	CAMGE R,ROW2		;LAST ROW OR BEYOND OR
	CAIN 0,7↔CALL(ADDSKY)	;OR MACRO ROW BOUNARY.

;SAVE & EXIT.
	CAMGE R,ROW2↔GO L1
	DAC C1,COL1↔DAC C2,COL2
	DAC B1,BRT1↔DAC B2,BRT2
	POP0J
BEND FILL;BGB 3 JULY 1973.___________________________________________
SUBR(ADDSKY)	;ADD SPAN INTO THE SKY ARRAY.
BEGIN ADDSKY;________________________________________________________

ACCUMULATORS{ROW,COL,R,C,C1,C2,B1,B2,CMIN,CMAX}
;	ROW & COL	MACRO PIXEL LOCUS.
;	R & C		MICRO PIXEL LOCUS.
;	C1 & C2		LEFT AND RIGHT COLUMNS OF SCAN LINE SEGMENT.
;	B1 & B2		LEFT AND RIGHT BRIGHTNESS OF "  "    " .
;	CMIN & CMAX	MICRO COLUMN EXTREMA PER MACRO ROW.
;	14 15 16 P

;GET COLUMN EXTREMA INTO MACRO PIXEL UNITS.
	LSH CMIN,-=21
	LSH CMAX,-=21
	LAC COL,CMIN

;ADD SPAN PIXELS TO SKY ARRAY AND CLEAR SPAN PIXELS.
L1:	XCT GETSKY(ROW);(COL)
	CAR 1,SPAN(COL)↔ADD 0,1
	DZM SPAN(COL)
	TLNE -1↔HLLOI		;SKY PIXEL OVERFLOW.
	XCT PUTSKY(ROW);(COL)
	CAMGE COL,CMAX
	AOJA COL,L1

;INCREMENT MACRO ROW.
	AOS ROW

;RESET COLUMN EXTREMA.
	SLACI CMIN,=288⊗3↔SETZ  CMAX,
	POP0J
BEND ADDSKY;BGB 2 JULY 1973.__________________________________________
SUBR(TVDSKO)  		INPUT TV PICTURE FROM A DISK FILE.
BEGIN TVDSKO;-----------------------------------------------------

;GET FILENAME.
;	CALL(GETFIL,[SIXBIT/TMP/],[SIXBIT/DATBGB/])↔POP0J
	LAC[SIXBIT/VIDEO/]↔DAC FILNAM
	LAC[SIXBIT/TMP/]↔DAC EXTION
	SETZM EXTION+1
	LAC[SIXBIT/DATBGB/]↔DAC PPPN

;INITIALIZE DISK.
	INIT 1,17↔SIXBIT/DSK/↔0↔HALT
	ENTER 1,FILNAM↔GO[OUTSTR[ASCIZ/	ENTER FAILED.
/]↔GO .+4]

;CLEAR AND RESET HEADER.
	LAC[XWD HEADER,HEADER+1]↔DZM HEADER↔BLT HEADER+177
	LAC[XWD HEAD1,HEADER]↔BLT HEADER+7

;DUMP MODE OUTPUT TO DISK.
	OUT 1,DUMARG↔JFCL
	OUTSTR[ASCIZ"	EOF.
"]↔	RELEASE 1,↔POP0J

;CRE-STANDARD TELEVISION FILE HEADER.
HEAD1:	-1
	6	; BITS PER BYTE.
	=48	;WORDS PER LINE.
	=20	;FIRST AND LAST ROW.
	=235
	=28
	=315	;FIRST AND LAST COL.
	XWD -=10368,200
DUMARG:	IOWD 24400,HEADER↔0
BEND TVDSKO; BGB 1 JULY 1973 -------------------------------------

FILNAM:	0
EXTION:	0
	0
PPPN:	0
SUBR(PACKTV)	;PACK SKY RASTER INTO TV BUFFER.
BEGIN PACKTV;________________________________________________________
	ACCUMULATORS{ROW,COL,PTR,I}
	SETZ I,
	LAC PTR,[POINT 6,TVBUF]
	SETZ ROW,
L1:	SETZ COL,
L2:	XCT GETSKY(ROW);(COL)		BRIGHTNESS 00.0000
	CAIGE 770000		;ALREADY BRIGHT ENOUGH.
	ADD RROUND(I)		;RANDOM ROUNDING.
	SOSGE I↔LACI I,=100
	LSH -=12↔IDPB PTR	;TRUNCATE AND PACK.
	CAIGE COL,=287↔AOJA COL,L2
	CAIGE ROW,=215↔AOJA ROW,L1
	POP0J

RROUND:	FOR I←0,=100{4000
}
BEND PACKTV;BGB 2 JULY 1973._________________________________________
;DATA AREA.
	CCWFLG:	0	;ORIENTATION OF TRIANGLE'S VERTICES.
	COLOR:	3	;COLOR BYTE SHIFT.
;TRIANGLE LIST.
	TPTR:	.+1
	TLIST:
		XWD =10⊗6,=20⊗6↔100
		XWD =100⊗6,=5⊗6↔300
		XWD =200⊗6,=200⊗6↔700

		XWD =10⊗6,=200⊗6↔700
		XWD =120⊗6,0↔300
		XWD =200⊗6,=100⊗6↔100

	-1

;CRE STANDARD TV FILE IS =10496 WORDS LONG, 24400 OCTAL.
;=128 WORD HEADER, =216 ROWS OF =288 COLUMNS OF 6 BITS PER PIXEL.

	HEADER:	BLOCK =128
	TVBUF:	BLOCK =10368	;TV BUFFER 6 BITS PER PIXEL.

	SPAN:	BLOCK =288	;SCAN LINE BUFFER.

;POINTERS TO TV BUFFER.

	POINT 6,-1,29	;COLUMN -2.
	POINT 6,-1,35	;COLUMN -1.
COLPTR:	FOR I←0,=48{
	I+<POINT 6,0,05>↔I+<POINT 6,0,11>↔I+<POINT 6,0,17>
	I+<POINT 6,0,23>↔I+<POINT 6,0,29>↔I+<POINT 6,0,35>}
ROWPTR:	FOR I←0,=216{
	I*=48+TVBUF}

;POINTER TO SKY ARRAY  -  216 ROWS OF 288 COLUMNS OF 18 BIT BYTES.
	PUTSKY:	FOR I←0,=107{	DIP 0,SKY+=288*I(3)
}		FOR I←0,=107{	DAP 0,SKY+=288*I(3)
}	GETSKY:	FOR I←0,=107{	CAR 0,SKY+=288*I(3)
}		FOR I←0,=107{	CDR 0,SKY+=288*I(3)
}
	SKY:	BLOCK =31104
END SA